#include <iostream>
#include <string>
#include <regex>

int main()
{
    // HTTP 请求行格式: GET /path HTTP/1.1\r\n
    std::string str = "GET /Island/login?user=xiao&pass=123456 HTTP/1.1\r\n";
    std::smatch matches;

    // 请求方法匹配: GET|POST|PUT|DELETE|HEAD|OPTIONS
    // std::regex method_regex("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?");
    std::regex method_regex(R"((GET|HEAD|POST|PUT|DELETE) ([^? ]+)(?:\?([^ ]+))? (HTTP/1\.[01])\r?\n)");
    // 转化为 小写字母 匹配
    // std::regex method_regex(R"((GET|HEAD|POST|PUT|DELETE) ([^? ]+)(?:\?([^ ]+))? (HTTP/1\.[01])\r?\n)", std::regex::icase);

    // GET|HEAD|POST|PUT|DELETE   表示匹配并提取其中任意一个字符串
    // [^?]*     [^?]匹配非问号字符， 后边的*表示0次或多次
    // \\?(.*)   \\?  表示原始的？字符 (.*)表示提取?之后的任意字符0次或多次，知道遇到空格
    // HTTP/1\\.[01]  表示匹配以HTTP/1.开始，后边有个0或1的字符串
    // (?:\n|\r\n)?   （?: ...） 表示匹配某个格式字符串，但是不提取， 最后的？表示的是匹配前边的表达式0次或1次
    
    bool ret = std::regex_match(str, matches, method_regex);
    if(!ret) return -1;

    /* matches[0] 整体首行 GET
    matches[1] 匹配HTTP方法 GET 
    matches[2] 匹配路径 /Island/login（直到问号）
    matches[3] 匹配查询参数（.* 匹配问号后到HTTP版本前的内容）
    matches[4] 匹配协议版本 HTTP/1.1 */

    // for(auto &s: matches){
    //     std::cout << "匹配到的请求: " << s << std::endl;
    // }

    std::cout << "完整匹配: " << matches[0] << std::endl;
    std::cout << "HTTP 方法: " << matches[1] << std::endl;
    std::cout << "路径: " << matches[2] << std::endl;
    std::cout << "查询参数: " << (matches[3].matched ? matches[3].str() : "") << std::endl;
    std::cout << "协议版本: " << matches[4] << std::endl;

    return 0;
}